package com.exam.online.system.util;

import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * @author yuzhen
 * @date 2019/4/13
 */
public class DateUtil {

    private static SimpleDateFormat DATEFORMAT = new SimpleDateFormat("yyyy-MM-dd");

    private static SimpleDateFormat TIMEFORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    public static int leadYearByTowTime(Timestamp timestamp) {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy");
        String lastTime = formatter.format(timestamp);
        String nowTime = formatter.format(new Timestamp(System.currentTimeMillis()));
        return Integer.parseInt(nowTime) - Integer.parseInt(lastTime);
    }

    public static String timeToString(Timestamp timestamp) {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return formatter.format(timestamp);
    }

    /**
     * Date->String，将时间转换为日期字符串,返回的日期字符串格式如: 2018-09-03
     *
     * @param date date
     * @return 2018-09-03
     */
    public static String toDate(Date date) {
        return DATEFORMAT.format(date);
    }

    /**
     * String->Date，将日期字符串转换为时间,格式如: 2018-09-03
     *
     * @param date 日期字符串,2018-09-03
     * @return Date
     */
    public static Date toDate(String date) {
        try {
            return DATEFORMAT.parse(date);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }


    /**
     * Date->String，将时间转换为具体时间字符串,格式如: 2018-09-03 08:08:08
     *
     * @return 2018-09-03 08:08:08
     */
    public static String toDateTime(Date date) {
        return TIMEFORMAT.format(date);
    }

    /**
     * String->Date，将时间字符串转换为具体时间
     *
     * @param date 日期字符串,2018-09-03 08:08:08
     * @return 返回格式如: 2018-09-03 08:08:08
     */
    public static Date toDateTime(String date) {
        try {
            return TIMEFORMAT.parse(date);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 将时间字符串转换为当天的开始时间,返回格式如: yyyy-MM-dd 00:00:00
     *
     * @param date 日期字符串,格式如 yyyy-MM-dd 或 13位时间戳
     * @return Date
     */
    public static Date toStartDateTime(String date) {
        try {
            if (date.matches("\\d{4}-\\d{2}-\\d{2}")) {
                return TIMEFORMAT.parse(date + " 00:00:00");
            }
            if (date.length() == 13) {
                return toStartDateTime(toDate(new Date(Long.valueOf(date))));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 将时间字符串转换为当天的结束时间,返回格式如: yyyy-MM-dd 23:59:59
     *
     * @param date 日期字符串,格式如 yyyy-MM-dd 或 13位时间戳
     * @return Date
     */
    public static Date toEndDateTime(String date) {

        try {
            if (date.matches("\\d{4}-\\d{2}-\\d{2}")) {
                return TIMEFORMAT.parse(date + " 23:59:59");
            }
            if (date.length() == 13) {
                return toEndDateTime(toDate(new Date(Long.valueOf(date))));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 自动识别String->Date，自动判断传入的字符串的格式并将其转换为Date
     *
     * @param date 日期字符串,格式如 yyyy-MM-dd 或 13位时间戳 或 yyy-MM-dd HH:mm:ss
     * @return 将时间字符串转换为Date
     */
    public static Date autoParse(String date) {
        try {
            if (date.matches("\\d{4}-\\d{2}-\\d{2}")) {
                return DATEFORMAT.parse(date);
            }
            if (date.length() == 13) {
                return new Date(Long.valueOf(date));
            }
            if (date.matches("\\d{4}-\\d{2}-\\d{2}\\s\\d{2}:\\d{2}:\\d{2}")) {
                return TIMEFORMAT.parse(date);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }


    /**
     * 获取当前具体时间字符串,格式如: 2018-09-03 08:08:08
     *
     * @return 2018-09-03 08:08:08
     */
    public static String nowDateTime() {
        return TIMEFORMAT.format(new Date());
    }

    /**
     * 获取当前日期字符串,格式如: 2018-09-03
     *
     * @return 2018-09-03
     */
    public static String nowDate() {
        return DATEFORMAT.format(new Date());
    }

    /**
     * 根据传入的规则和时间进行转换，获取日期字符串
     *
     * @param pattern : 格式
     * @param date    : 时间
     * @return String
     */
    public static String format(String pattern, Date date) {
        try {
            SimpleDateFormat format = new SimpleDateFormat(pattern);
            return format.format(date);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 根据传入的规则和时间字符串进行转换，将日期字符串转换为Date
     *
     * @param pattern : 格式
     * @param dateStr : 时间
     * @return Date
     */
    public static Date parse(String pattern, String dateStr) {
        try {
            SimpleDateFormat format = new SimpleDateFormat(pattern);
            return format.parse(dateStr);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 获取日期字符串,格式如：2018-09-03 08:08:08
     *
     * @param date : 时间
     * @return 2018-09-03 08:08:08
     */
    public static String format(Date date) {
        try {
            return TIMEFORMAT.format(date);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 获取本月第一天字符串如：2018-09-03
     *
     * @return 2018-09-01
     */
    public static String getFirstOfMonth() {
        return format("yyyy-MM-01", new Date());
    }


    /**
     * 获取今天是当前月的第几天
     *
     * @return int
     */
    public static int getDayOfMonth() {
        Calendar date = Calendar.getInstance();
        date.setTime(new Date());
        return date.get(Calendar.DAY_OF_MONTH);
    }

    /**
     * 获取今天是星期几
     *
     * @param dateTime 2018-09-03
     * @return 星期几
     */
    public static int getDayOfWeek(String dateTime) {
        Calendar date = Calendar.getInstance();
        date.setTime(toDate(dateTime));
        return date.get(Calendar.DAY_OF_WEEK);
    }

    /**
     * 对日期进行加减
     *
     * @param date 日期
     * @param day: 加减的天数
     * @return 返回编辑后的日期
     */
    public static Date editDate(Date date, int day) {

        if (date == null) {
            return null;
        }

        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.DATE, calendar.get(Calendar.DATE) + day);

        return calendar.getTime();
    }

    /**
     * 得到当前的Timestamp
     *
     * @return 当前的时间戳
     */
    public static Timestamp getTimestamp() {
        return new Timestamp(System.currentTimeMillis());
    }
}
